package indi.zn.commons.serialno;

import java.util.concurrent.ConcurrentHashMap;

import indi.zn.script.groovy.GroovyRunner;

/**  
*
*  
* @author 周楠
* @Description: 
* @date 2017年10月13日
*
*/

public class SerialNoProvider {
	
	
	private SeqPersistenceService seqPersister;
	
	private String dialect;
	
	private GroovyRunner gRunner = new GroovyRunner();
	
	 public String getDialect() {
		return dialect;
	}


	public void setDialect(String dialect) {
		this.dialect = dialect;
	}


	public SeqPersistenceService getSeqPersister() {
		return seqPersister;
	}


	public void setSeqPersister(SeqPersistenceService seqPersister) {
		this.seqPersister = seqPersister;
	}

	private ConcurrentHashMap<String, SerialNo> serialNoSet=new ConcurrentHashMap<>();
	 
	
	/**
	 * 
	 * @param clazz
	 * @param gtime
	 * @param bcode
	 * @param randomBound
	 * @param formatter  保留变量  $bcode 基础码 $time yyMMdd 日期  $seq 序列  $random 随机值 （需设定 randomBound:int ）
 	 * @param gRunner
	 * @return
	 */
	public SerialNo  providerDefualSeqSerialNo(String clazz,boolean gtime,String bcode,Integer randomBound,String script,GroovyRunner gRunner) {
		                       
		 Sequence seq=new Sequence(clazz, 0l, 1, 1000000l, true, seqPersister,dialect);
		 
		 SerialNo sn=new SerialNo(clazz, gtime, bcode, seq, randomBound, script,gRunner);
				 
		 serialNoSet.put(clazz, sn);
		
		return sn;
	}
	
	
	public SerialNo  providerNewSerialNo(SerialNoConfig config,String script) {
        
		 Sequence seq=new Sequence(config.getSerialNoName(),config.getBegin(), config.getStep(),config.getRange(), true, seqPersister,dialect);
		 
		 SerialNo sn=new SerialNo(config.getSerialNoName(),config.isgTime(), config.getBcode(), seq, config.getRandomBound(), script,gRunner,config.getDateFormat());
				 
		 serialNoSet.put(config.getSerialNoName(), sn);
		
		return sn;
	}
	
	public SerialNo  providerNewSerialNo(String configPath,String script) {
		
		SerialNoConfig config=new SerialNoConfig();
		
		 Sequence seq=new Sequence(config.getSerialNoName(),config.getBegin(), config.getStep(),config.getRange(), true, seqPersister,dialect);
		 
		 SerialNo sn=new SerialNo(config.getSerialNoName(),config.isgTime(), config.getBcode(), seq, config.getRandomBound(), script,gRunner,config.getDateFormat());
				 
		 serialNoSet.put(config.getSerialNoName(), sn);
		
		return sn;
	}
	
	
	
	
	

	 public SerialNo  providerSerialNo(String clazz) {
		 
		return serialNoSet.get(clazz);
		 
	 }
	 
	 public String  providerSerialNoStr(String clazz) {
		 
		return serialNoSet.get(clazz).getSerialNoStr();
			 
	}
	 
	 
	 
	 
	 
	 
}
